/**
 * ts中函数类型，约束的是它的参数和返回值
 */

/**
 * 必须写的是函数参数的类型
 * 返回值类型是在函数（）后面通过：写上，返回值类型可以根据返回值类自动推断出来
 */
function add (x: number, y: number): number {
  return x + y
}

const result = add(1, 2)
console.log('---result---', result)

/**
 * 如果返回值，明确指定必须返回某个值，那么你函数体里面，就必须 return 对应的值
 */
function test (x: number, y: number): string {
  //   return x + y
  return 'nihao'
}

// 如果我们的函数在很多地方都用到它，我们可以使用 type 去抽取该函数的类型
/**
 * 如果我们加法函数要通过类型别名抽取出去，那么它的返回值要写成  =>
 */
type MyFn = (x: number, y: number) => number

let add1: MyFn = (x, y) => {
  return x + y
}

let add2: MyFn = (x, y) => {
  return x + y
}

function splice (x?: number, y?: number) {}

splice()

splice(1)

splice(1, 2)

let arr = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']
// 如何查看，某个函数的具体实现呢？按住键盘的ctrl，进行点击
// 它就会进入到数组的类型声明文件中
// const res1 = arr.slice()
// console.log(res1)

// const res1 = arr.slice(1)
// console.log(res1)

const res1 = arr.slice(1, 3)
console.log(res1)

function printMe (name: string): void {
  // 如果已经明确说明没有返回值了，则方法体里面不能写返回值
  // return 'zhangsan'
}

function fn (a: string): string {
  // return true
  return 'aaa'
}

export {}
